const gAppEventMgr = {
  eventObjectList: []
};

export function getEventMgr(eventName) {
  let eventObject = null;
  for(let i=0;i<gAppEventMgr.eventObjectList.length;i++) {
    if(gAppEventMgr.eventObjectList[i].eventName == eventName) {
      eventObject = gAppEventMgr.eventObjectList[i];
    }
  }
  if(!eventObject) {
    eventObject = {
      eventName: eventName,
      eventListener: [],
      addListener: null,
      removeListener: null,
      sendEvent: null
    };
    eventObject.addListener = (listener)=>{
      if(listener) {
        if(!eventObject.eventListener.includes(listener)) {
          eventObject.eventListener.push(listener);
        }
      }
      return eventObject;
    };
    eventObject.removeListener = (listener)=>{
      if(listener) {
        for(let i=0;i<eventObject.eventListener.length;i++) {
          if(eventObject.eventListener[i] == listener) {
            eventObject.eventListener[i] = eventObject.eventListener[eventObject.eventListener.length - 1];
            eventObject.eventListener.pop();
            break;
          }
        }
      }
      return eventObject;
    };
    eventObject.sendEvent = async (msg)=>{
      if(msg) {
        for(let i=0;i<eventObject.eventListener.length;i++) {
          await eventObject.eventListener[i](msg);
        }
      }
    };
    gAppEventMgr.eventObjectList.push(eventObject);
  }
  return eventObject;
}

export function createEventHandler(eventName) {
  let eventObject = getEventMgr(eventName);
  let eventHandler = {
    eventObject: eventObject,
    addListener: null,
    removeListener: null,
    sendEvent: null,
    clear: null,
    eventListener: []
  };
  eventHandler.addListener = (listener)=>{
    if(listener) {
      if(!eventHandler.eventListener.includes(listener)) {
        eventHandler.eventListener.push(listener);
        eventHandler.eventObject.addListener(listener);
      }
    }
    return eventHandler;
  };
  eventHandler.removeListener = (listener) =>{
    if(listener) {
      if(eventHandler.eventListener.includes(listener)) {
        for(let i=0;i<eventHandler.eventListener.length;i++) {
          if(eventHandler.eventListener[i] == listener) {
            eventHandler.eventListener[i] = eventHandler.eventListener[eventHandler.eventListener.length - 1];
            eventHandler.eventListener.pop();
            eventHandler.eventObject.removeListener(listener);
            break;
          }
        }
      }
    }
    return eventHandler;
  };
  eventHandler.sendEvent = (msg)=>{
    if(msg) {
      eventHandler.eventObject.sendEvent(msg);
    }
    return eventHandler;
  };
  eventHandler.clear = ()=>{
    for(let i=0;i<eventHandler.eventListener.length;i++) {
      eventHandler.eventObject.removeListener(eventHandler.eventListener[i]);
    }
    eventHandler.eventListener = [];
    return eventHandler;
  };
  return eventHandler;
}
